<?php

/* Finally, A light, permissions-checking logging class. 
 * 
 * Author	: Kenneth Katzgrau < katzgrau@gmail.com >
 * Date	: July 26, 2008
 * Comments	: Originally written for use with wpSearch
 * Website	: http://codefury.net
 * Version	: 1.0
 *
 * Usage: 
 * 		$log = new KLogger ( "log.txt" , KLogger::INFO );
 * 		$log->LogInfo("Returned a million search results");	//Prints to the log file
 * 		$log->LogFATAL("Oh dear.");				//Prints to the log file
 * 		$log->LogDebug("x = 5");				//Prints nothing due to priority setting
 */
class KLogger {
  const DEBUG = 1; // Most Verbose
  const INFO = 2; // ...
  const WARN = 3; // ...
  const ERROR = 4; // ...
  const FATAL = 5; // Least Verbose
  const OFF = 6; // Nothing at all.

  const LOG_OPEN = 1;
  const OPEN_FAILED = 2;
  const LOG_CLOSED = 3;
  const ZONA_HORARIA = "America/Santiago";

  /* Public members: Not so much of an example of encapsulation, but that's okay. */

  public $Log_Status = KLogger::LOG_CLOSED;
  public $DateFormat = "Y-m-d G:i:s";
  public $MessageQueue;
  private $log_file;
  private $priority = KLogger::INFO;
  private $file_handle;

  public function __construct($filepath, $priority) {
    if ($priority == KLogger::OFF)
      return;

    $this->log_file = $filepath;
    $this->MessageQueue = array();
    $this->priority = $priority;

    if (file_exists($this->log_file)) {
      if (!is_writable($this->log_file)) {
        $this->Log_Status = KLogger::OPEN_FAILED;
        $this->MessageQueue[] = "Este archivo existe, pero no puede ser abierto para escribir. Comprobar si tiene los permisos adecuados.";
        return;
      }
    }

    //if ($this->file_handle = fopen($this->log_file, "a")) {
    $this->file_handle = fopen($this->log_file, "a");
    if ($this->file_handle) {
      $this->Log_Status = KLogger::LOG_OPEN;
      $this->MessageQueue[] = "El archivo de registro se abrio con exito.";
    } else {
      $this->Log_Status = KLogger::OPEN_FAILED;
      $this->MessageQueue[] = "El archivo no se puede abrir. Comprobar los permisos.";
    }

    return;
  }

  public function __destruct() {
    if ($this->file_handle)
      fclose($this->file_handle);
  }

  public function logInfo($line) {
    $this->log($line, KLogger::INFO);
  }

  public function logDebug($line) {
    $this->log($line, KLogger::DEBUG);
  }

  public function logWarn($line) {
    $this->log($line, KLogger::WARN);
  }

  public function logError($line) {
    $this->log($line, KLogger::ERROR);
  }

  public function logFatal($line) {
    $this->log($line, KLogger::FATAL);
  }

  public function log($line, $priority) {
    if ($this->priority <= $priority) {
      $status = $this->getTimeLine($priority);
      $this->writeFreeFormLine("$status $line\n");
    }
  }

  public function writeFreeFormLine($line) {
    if ($this->Log_Status == KLogger::LOG_OPEN && $this->priority != KLogger::OFF) {
      if (fwrite($this->file_handle, $line) === false) {
        $this->MessageQueue[] = "El archivo no se puede escribir. Comprobar si tiene los permisos adecuados.";
      }
    }
  }

  private function getTimeLine($level) {
    date_default_timezone_set(self::ZONA_HORARIA);
    $time = date($this->DateFormat);

    switch ($level) {
      case KLogger::INFO:
        return "$time - INFO  -->";
      case KLogger::WARN:
        return "$time - WARN  -->";
      case KLogger::DEBUG:
        return "$time - DEBUG -->";
      case KLogger::ERROR:
        return "$time - ERROR -->";
      case KLogger::FATAL:
        return "$time - FATAL -->";
      default:
        return "$time - LOG   -->";
    }
  }

}

?>